package DyingBaby.demo;

import DyingBaby.backend.dm.pageCache.PageCache;
import DyingBaby.backend.dm.pageCache.PageCacheImpl;
import java.io.File;

/**
 * 缓存命中测试程序 - 专门验证缓存统计功能
 */
public class CacheHitTest {
    
    public static void main(String[] args) {
        try {
            // 创建临时测试文件
            File testFile = File.createTempFile("cache_hit_test", ".db");
            testFile.deleteOnExit();
            
            // 先删除可能存在的文件
            if (testFile.exists()) {
                testFile.delete();
            }
            
            // 创建页面缓存，设置较小的缓存大小以便测试缓存淘汰
            // 10页 * 8KB = 80KB，满足最小限制
            PageCacheImpl pageCache = PageCache.create(testFile.getAbsolutePath().replace(".db", ""), 80 * 1024);
            
            System.out.println("=== 缓存命中测试 ===");
            System.out.println("缓存大小: 10页");
            
            // 测试1: 创建页面并验证统计
            System.out.println("\n1. 创建5个页面:");
            int[] pages = new int[5];
            for (int i = 0; i < 5; i++) {
                pages[i] = pageCache.newPage(("Page " + (i+1) + " data").getBytes());
                System.out.println("创建页面: " + pages[i]);
            }
            
            System.out.println("\n当前统计:");
            pageCache.printCacheStats();
            
            // 测试2: 访问已存在的页面（应该命中）
            System.out.println("\n2. 访问已存在的页面（测试缓存命中）:");
            for (int i = 0; i < 3; i++) {
                System.out.println("访问页面: " + pages[i]);
                pageCache.getPage(pages[i]);
            }
            
            System.out.println("\n访问后统计:");
            pageCache.printCacheStats();
            
            // 测试3: 创建新页面触发缓存淘汰（应该未命中）
            System.out.println("\n3. 创建新页面触发缓存淘汰（测试缓存未命中）:");
            int newPage = pageCache.newPage("New page data".getBytes());
            System.out.println("创建新页面: " + newPage);
            pageCache.getPage(newPage);
            
            System.out.println("\n淘汰后统计:");
            pageCache.printCacheStats();
            
            // 测试4: 再次访问之前被淘汰的页面（应该未命中）
            System.out.println("\n4. 访问被淘汰的页面（测试缓存未命中）:");
            System.out.println("访问被淘汰的页面: " + pages[0]);
            pageCache.getPage(pages[0]);
            
            System.out.println("\n最终统计:");
            pageCache.printCacheStats();
            
            // 测试5: 验证命中率计算
            System.out.println("\n5. 命中率分析:");
            long totalRequests = pageCache.getTotalRequests();
            long hitCount = pageCache.getHitCount();
            long missCount = pageCache.getMissCount();
            double hitRate = pageCache.getHitRate();
            
            System.out.println("总请求次数: " + totalRequests);
            System.out.println("命中次数: " + hitCount);
            System.out.println("未命中次数: " + missCount);
            System.out.println("命中率: " + String.format("%.2f%%", hitRate * 100));
            System.out.println("验证: " + hitCount + " + " + missCount + " = " + (hitCount + missCount) + " (应该等于总请求次数)");
            
            // 测试6: 性能报告
            System.out.println("\n6. 性能报告:");
            System.out.println(pageCache.getCachePerformanceReport());
            
            // 测试7: 重置统计
            System.out.println("\n7. 重置统计信息:");
            pageCache.resetCacheStats();
            pageCache.printCacheStats();
            
            pageCache.close();
            
            System.out.println("\n=== 测试完成 ===");
            System.out.println("如果看到以上输出，说明缓存统计功能正常工作！");
            
        } catch (Exception e) {
            System.err.println("测试失败: " + e.getMessage());
            e.printStackTrace();
        }
    }
}
